/* 
 * MIT License
 *
 * Copyright (c) 2019 极简美 @ konishi5202@163.com
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "mt_timer.h"

void timeout_handle(void *arg)
{
    printf("[%ld]:timeout1\n", time(NULL));
}

void timeout_handler(void *arg)
{
    printf("[%ld]:timeout2\n", time(NULL));
}

TIMER_CREATE(test);

int main(void)
{
#if 0

下面是一个非常简单的使用示例：；当所有定时任务都超时后，输入回车即可退出：
#endif
    int timer1;
    int timer2;
    char a ;
    struct itimerspec itimespec;

    TIMER_INIT(test, 10);
    // 第一次超时都是3s，后面每隔1s超时一次
    itimespec.it_value.tv_sec = 2;
    itimespec.it_value.tv_nsec = 0;
    itimespec.it_interval.tv_sec = 1;
    itimespec.it_interval.tv_nsec = 0;

    //共创建了两个定时任务，但第一个定时任务频次为2，第二个定时任务频次为-1
    // TIMER_ADD()添加定时任务成功返回新定时任务的文件描述符，失败返回 < 0。返回的文件描述符，可用于在TIMER_DEL()中删除定时任务。
    //arg - repeat是周期定时任务的重复次数，若设置为**-1，代表永远重复；0，代表一次都不执行(同时，会在下次添加定时器时被剔除)**；
    timer1 = TIMER_ADD(test, &itimespec, 0, timeout_handle, NULL);
    printf("ADD with %d\n", timer1);
    timer2 = TIMER_ADD(test, &itimespec, -1, timeout_handler, NULL);
    printf("ADD with %d\n", timer2);

    timer1 = TIMER_ADD(test, &itimespec, 5, timeout_handle, NULL);
    printf("[%ld]:timer_add : %d\n", time(NULL), TIMER_COUNT(test));
    
    while(1)
    {
        a = getchar();
        if(a =='s')
        {
            a = TIMER_COUNT(test);
            printf("count = %d\n", a);
            break;
        }
    }
    timer2 = TIMER_ADD(test, &itimespec, -1, timeout_handler, NULL);
    printf("ADD with %d\n", timer2);
    a = TIMER_COUNT(test);
    printf("count = %d\n", a);
    printf("[%ld]:timer_del : %d\n", time(NULL), TIMER_COUNT(test));
    // 清空所有剩余的任务
    TIMER_CLEAR(test);
    printf("[%ld]:timer_clear : %d\n", time(NULL), TIMER_COUNT(test));

    TIMER_DEINIT(test);
    
    return 0;
}

